package cn.ld.module.system.convert.user;

import cn.ld.framework.common.util.collection.CollectionUtils;
import cn.ld.framework.common.util.collection.MapUtils;
import cn.ld.framework.common.util.object.BeanUtils;
import cn.ld.module.system.controller.admin.dept.vo.dept.DeptSimpleOutVO;
import cn.ld.module.system.controller.admin.dept.vo.post.PostSimpleOutVO;
import cn.ld.module.system.controller.admin.permission.vo.role.RoleSimpleOutVO;
import cn.ld.module.system.controller.admin.user.vo.profile.UserProfileOutVO;
import cn.ld.module.system.controller.admin.user.vo.user.UserOutVO;
import cn.ld.module.system.controller.admin.user.vo.user.UserSimpleOutVO;
import cn.ld.module.system.dal.entity.dept.DeptEntity;
import cn.ld.module.system.dal.entity.dept.PostEntity;
import cn.ld.module.system.dal.entity.permission.RoleEntity;
import cn.ld.module.system.dal.entity.social.SocialUserEntity;
import cn.ld.module.system.dal.entity.user.AdminUserEntity;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;
import java.util.Map;

@Mapper
public interface UserConvert {

    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    default List<UserOutVO> convertList(List<AdminUserEntity> list, Map<Long, DeptEntity> deptMap) {
        return CollectionUtils.convertList(list, user -> convert(user, deptMap.get(user.getDeptId())));
    }

    default UserOutVO convert(AdminUserEntity user, DeptEntity dept) {
        UserOutVO userVO = BeanUtils.toBean(user, UserOutVO.class);
        if (dept != null) {
            userVO.setDeptName(dept.getName());
        }
        return userVO;
    }

    default List<UserSimpleOutVO> convertSimpleList(List<AdminUserEntity> list, Map<Long, DeptEntity> deptMap) {
        return CollectionUtils.convertList(list, user -> {
            UserSimpleOutVO userVO = BeanUtils.toBean(user, UserSimpleOutVO.class);
            MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> userVO.setDeptName(dept.getName()));
            return userVO;
        });
    }

    default UserProfileOutVO convert(AdminUserEntity user, List<RoleEntity> userRoles,
                                      DeptEntity dept, List<PostEntity> posts, List<SocialUserEntity> socialUsers) {
        UserProfileOutVO userVO = BeanUtils.toBean(user, UserProfileOutVO.class);
        userVO.setRoles(BeanUtils.toBean(userRoles, RoleSimpleOutVO.class));
        userVO.setDept(BeanUtils.toBean(dept, DeptSimpleOutVO.class));
        userVO.setPosts(BeanUtils.toBean(posts, PostSimpleOutVO.class));
        userVO.setSocialUsers(BeanUtils.toBean(socialUsers, UserProfileOutVO.SocialUser.class));
        return userVO;
    }

}
